package model.persistence.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import model.persistence.AbstractDAO;

import model.business.Cela;
import model.business.CelaImpl;


public class PostgresCelaDAO extends AbstractDAO{

    public Object insert(Object dto) throws SQLException {
        if(!(dto instanceof Cela)) //se algo que nao seja Cela
            throw new SQLException("Tipo de dado inválido para cadastro no banco de dados");

        Cela cela = (Cela) dto;

        Connection connection = this.getConnection();
        PreparedStatement statement = null;
        ResultSet resultSet = null;

        try{
            statement = connection.prepareStatement("INSERT INTO CELA (CELA, GALERIA, SITUACAO, TIPO) VALUES (?,?,?,?);"); //prepareStatement - executa comandos SQL, ? separadas por virgula
            statement.setString(1, cela.getCela());
            statement.setString(2, cela.getGaleria());
            statement.setString(3, cela.getSituacao());
            statement.setString(4, cela.getTipo());
            statement.execute();

            statement = connection.prepareStatement("SELECT * FROM CELA WHERE CELA = ? AND GALERIA = ? AND SITUACAO = ? AND TIPO = ?");
            statement.setString(1, cela.getCela());
            statement.setString(2, cela.getGaleria());
            statement.setString(3, cela.getSituacao());
            statement.setString(4, cela.getTipo());
                      

            resultSet = statement.executeQuery();//traz o q esta no cache do banco pra voce
            resultSet.next();

            cela = new CelaImpl(resultSet.getInt("ID"), resultSet.getString("CELA"), resultSet.getString("GALERIA"), resultSet.getString("SITUACAO"), resultSet.getString("TIPO"));

        }catch(SQLException erroBD){
            throw new SQLException("Não foi possível cadastrar a Cela. \n Motivo:  \n" + erroBD.getMessage());
        }finally{
            if(statement != null)
                statement.close();
        }
        return cela;
    }

    public Object update(Object dto) throws SQLException {
         if(!(dto instanceof Cela)) //se algo que nao seja Cela
            throw new SQLException("Tipo de dado inválido para cadastro no banco de dados");

        Cela cela = (Cela) dto;

        Connection connection = this.getConnection();
        PreparedStatement statement = null;

        try{
            statement = connection.prepareStatement("UPDATE CELA SET CELA = ?, GALERIA = ?, SITUACAO = ?, TIPO = ? WHERE ID = ?;");
            statement.setString(1, cela.getCela());
            statement.setString(2, cela.getGaleria());
            statement.setString(3, cela.getSituacao());
            statement.setString(4, cela.getTipo());

            int oid = ((Integer) cela.getOID()).intValue();
            statement.setInt(5, oid);
            statement.execute();

        }catch(SQLException erroBD){
            throw new SQLException("Não foi possível alterar a Cela. \n Motivo: " + erroBD.getMessage());
        }finally{
            if(statement != null)
                statement.close();
        }
        return cela;
    }

    public void delete(Object dto) throws SQLException {
        if(!(dto instanceof Cela)) //se algo que nao seja Cela
            throw new SQLException("Tipo de dado inválido para cadastro no banco de dados");

        Cela cela = (Cela) dto;

        Connection connection = this.getConnection();
        PreparedStatement statement = null;

        try{
            statement = connection.prepareStatement("DELETE FROM CELA WHERE ID = ?;");
            
            int oid = ((Integer) cela.getOID()).intValue();
            statement.setInt(1, oid);
            statement.execute();

        }catch(SQLException erroBD){
            throw new SQLException("Não foi possível excluir a Cela. \n Motivo: " + erroBD.getMessage());
        }finally{
            if(statement != null)
                statement.close();
        }
    }

      public Object find(Object oid) throws SQLException {
        if(!(oid instanceof Integer))
            throw new SQLException("ID não é um número inteiro.");
        int idlogin = ((Integer) oid).intValue();
        Connection connection = this.getConnection();
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        Cela cela = null; //posso criar tambem CelaImpl cela
        try{
            statement = connection.prepareStatement("SELECT * FROM CELA WHERE ID = ?;");
            statement.setInt(1, idlogin);
            resultSet = statement.executeQuery();
            if(!resultSet.next())
                throw new SQLException("Não existe Usuário com idlogin = " + idlogin);
            cela = new CelaImpl(resultSet.getInt("ID"), resultSet.getString("CELA"), resultSet.getString("GALERIA"), resultSet.getString("SITUACAO"),resultSet.getString("TIPO")); //transformando a linha do banco em um objeto

        }catch(SQLException erroBD){
            throw new SQLException("Não foi possível encontrar a Cela \n Motivo: " + erroBD.getMessage());
        }finally{
            if(resultSet != null)
                resultSet.close();
            if(statement != null)
                statement.close();
        }
        return cela;
    }      
       
}
